package persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.swing.JOptionPane;

import logica.Cliente;
import logica.Desarrollador;

public class PersistirPerfil extends Persistir{

	public PersistirPerfil() {}
	
/**********************************************************************************************************/
/**********************************************************************************************************/
	/*------------------------ COMPRAR JUEGO y CONSULTA DE PERFIL -------------------*/
	
	//DEVUELVE COMO RESULTADO TODOS LOS NICKS DE LOS CLIENTES
	public ResultSet getNickCliente(){
		ResultSet clientes = null;
		try {
			Statement obtener = this.getConexion().createStatement();
			clientes = obtener.executeQuery("SELECT Nick FROM Cliente");
		}
		catch (Exception e) {
			JOptionPane.showMessageDialog(null,"ERROR AL CONECTAR LA BASE DE DATOS EN getNicksClientes");
		}
		return clientes;
	}
	
	//DEVUELVE COMO RESULTADO LOS JUEGOS QUE HA COMPRA EL CLIENTE DE NICK
	public ResultSet getJuegosDe(String nick){
		ResultSet juegos = null;
		try {
			Statement obtener = this.getConexion().createStatement();
			ResultSet rs = obtener.executeQuery(""
			+ "SELECT jue.Nombre "
			+ "FROM Juego jue, Compra com, Cliente cli "
			+ "WHERE jue.Id = com.Id_Juego AND "
			+ "com.Id_Cliente = cli.Id AND "
			+ "cli.Nick = '"+nick.toUpperCase()+"' ");
			juegos = rs;
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		return juegos;
	}

/**********************************************************************************************************/
/**********************************************************************************************************/
/*------------------------ ALTA DE PERFIL -------------------*/
	
	//DEVUELVE COMO RESULTADO TODOS LOS EMAIL DE LOS DESARROLLADORES
	public ResultSet getEmailDesarrolladores(){
		ResultSet rs = null;
		try{
			Statement consulta = this.getConexion().createStatement();
			rs= consulta.executeQuery("SELECT Email FROM Desarrollador");
		}
		catch (SQLException e) {
			JOptionPane.showMessageDialog(null,"ERROR AL CONECTAR LA BASE DE DATOS EN getEmailDesarrolladores");
		}
		return rs;
	}
	
	//DEVUELVE COMO RESULTADO TODOS LOS EMAIL DE LOS CLIENTES
	public ResultSet getEmailClientes(){
		ResultSet rs = null;
		try{
			Statement consulta = this.getConexion().createStatement();
			rs= consulta.executeQuery("SELECT Email FROM Cliente");
		}
		catch (SQLException e) {
			JOptionPane.showMessageDialog(null,"ERROR AL CONECTAR LA BASE DE DATOS EN getEmailCliente");
		}
		return rs;
	}
	
	
	// FUNCION AGREGAR CLIENTE A LA BASE DE DATOS
	public void addCliente(Cliente cli) throws SQLException {
		Connection cox = this.getConexion();
		PreparedStatement ps =	cox.prepareStatement(""
		+ "INSERT INTO Cliente (Nick,Email,Nombre,Apellido,Edad,Imagen,Nacimiento) VALUES (?,?,?,?,?,?,?);");
		ps.setString(1, cli.getNick());
		ps.setString(2, cli.getEmail());
		ps.setString(3, cli.getNombre());
		ps.setString(4, cli.getApellido());
		ps.setInt(5, cli.getEdad());
		ps.setBytes(6, cli.getByteFoto());
		ps.setLong(7, cli.getNacimiento().getTime());
		ps.executeUpdate();
		ps.close();	
	}


	// AGREGO DESARROLLADOR A LA BASE DE DATOS
	public void addDesarrollador(Desarrollador des) throws SQLException {
		Connection cox = this.getConexion();
		PreparedStatement ps =	cox.prepareStatement(""
		+ "INSERT INTO Desarrollador (Nick,Email,Nombre,Apellido,Edad,Imagen,Nacimiento, Link) VALUES (?,?,?,?,?,?,?,?);");
		ps.setString(1, des.getNick());
		ps.setString(2, des.getEmail());
		ps.setString(3, des.getNombre());
		ps.setString(4, des.getApellido());
		ps.setInt(5, des.getEdad());
		ps.setBytes(6, des.getByteFoto());
		ps.setLong(7, des.getNacimiento().getTime());
		ps.setString(8, des.getLink());
		ps.executeUpdate();
		ps.close();
	}
	

/**********************************************************************************************************/
/**********************************************************************************************************/
/*----------- CONSULA DE PERFIL ------------- GASTON  -------------------*/
	
	
	//DEVUELVE UNA SELECCION DE NICKS DE TODOS LOS DESARROLLADORES
	public ResultSet getNickDesarrollador() {
		ResultSet rs = null;
		try{
			Statement obtener = this.getConexion().createStatement();
			rs = obtener.executeQuery("SELECT Nick FROM Desarrollador");
		} 
		catch (Exception e) {
			JOptionPane.showMessageDialog(null, "ERROR AL CONECTAR LA BASE DE DATOS EN getNickDesarrolladores");
		}
		return rs;
	}
	
	
	//DEVUELVE LA INFORMACION DEL PERFIL DEL CLIENTE
	public ResultSet getDataInfoCliente(String nick) {
		ResultSet datos = null;
		try{
			Statement obtener = this.getConexion().createStatement();
			ResultSet rs = obtener.executeQuery("SELECT * FROM Cliente WHERE Nick = '"+nick.toUpperCase()+"'");
			datos = rs;
		}
		catch (Exception e) {
			JOptionPane.showMessageDialog(null, "ERROR AL CONECTAR LA BASE DE DATOS EN getDataInfoCliente");
		}
		return datos;
	}
	
	
	//DEVUELVE LA INFORMACION DEL PERFIL DEL DESARROLLADOR
	public ResultSet getDataInfoDesarrollador(String nick) {
		ResultSet rs = null;
		try{
			Statement obtener = this.getConexion().createStatement();
			rs = obtener.executeQuery("SELECT * FROM Desarrollador WHERE Nick = '"+nick.toUpperCase()+"'");
		}
		catch (Exception e) {
			JOptionPane.showMessageDialog(null, "ERROR AL CONECTAR LA BASE DE DATOS EN getDataInfoDesarrollador");
		}
		return rs;
	}

	
	
/**********************************************************************************************************/
/**********************************************************************************************************/
/*------------------------ MODIFICAR PERFIL   -------------------*/
	
	
	//HACE UN UPDATE AL DESARROLLADOR DE NICK
	public void updateDesarrollador(Desarrollador des,String nick) throws SQLException{
		Statement obtener = this.getConexion().createStatement();
		ResultSet rs = obtener.executeQuery("SELECT Id FROM Desarrollador WHERE Nick = '"+nick+"'");
		
		PreparedStatement ps =	getConexion().prepareStatement(""
		+ "UPDATE Desarrollador SET "
		+ "Nick = ?, "
		+ "Nombre = ?, "
		+ "Apellido = ?, "
		+ "Email = ?, "
		+ "Nacimiento = ?, "
		+ "Edad = ?, "
		+ "Link = ? "
		+ "WHERE Id = ?;");		
		ps.setString(1, des.getNick());
		ps.setString(2, des.getNombre());
		ps.setString(3, des.getApellido());
		ps.setString(4, des.getEmail());
		ps.setLong(5, des.getNacimiento().getTime());
		ps.setInt(6, des.getEdad());
		ps.setString(7, des.getLink());
		ps.setInt(8, rs.getInt("Id"));
		ps.executeUpdate();
		ps.close();
		
		if(des.getByteFoto() != null){
			ps = getConexion().prepareStatement("UPDATE Desarrollador SET Imagen = ? WHERE Id = ?;");
			ps.setBytes(1, des.getByteFoto());
			ps.setInt(2, rs.getInt("Id"));
			ps.executeUpdate();
			ps.close();
		}
		
		rs.close();
	}
			
	
	
	

	//HACE UN UPDATE AL CLINETE DE NICK
	public void updateCliente(Cliente cli,String nick) throws SQLException {
			Statement obtener = this.getConexion().createStatement();
			ResultSet rs = obtener.executeQuery("SELECT Id FROM Cliente WHERE Nick = '"+nick+"'");
			PreparedStatement ps =	getConexion().prepareStatement(""
			+ "UPDATE Cliente SET "
			+ "Nick = ?, "
			+ "Nombre = ?, "
			+ "Apellido = ?, "
			+ "Email = ?, "
			+ "Nacimiento = ?, "
			+ "Edad = ? "
			+ "WHERE Id = ?;");
			ps.setString(1, cli.getNick());
			ps.setString(2, cli.getNombre());
			ps.setString(3, cli.getApellido());
			ps.setString(4, cli.getEmail());
			ps.setLong(5, cli.getNacimiento().getTime());
			ps.setInt(6, cli.getEdad());
			ps.setInt(7, rs.getInt("Id"));
			ps.executeUpdate();
			ps.close();
			
			if(cli.getByteFoto() != null){
				ps = getConexion().prepareStatement("UPDATE Cliente SET Imagen = ? WHERE Id = ?;");
				ps.setBytes(1, cli.getByteFoto());
				ps.setInt(2, rs.getInt("Id"));
				ps.executeUpdate();
				ps.close();
			}
			
			rs.close();
	}
	
	
	//MODIFICA LA FOTO DEL PERFIL CON NICK
	public void cambiarFotoPerfil(byte[] byteFoto, String nick, boolean esDes) throws SQLException{
			PreparedStatement ps = null;
			if(esDes)
				ps = getConexion().prepareStatement("UPDATE Desarrollador SET Imagen = ? WHERE Nick = ?;");
			else
				ps = getConexion().prepareStatement("UPDATE Cliente SET Imagen = ? WHERE Nick = ?;");
			
			ps.setBytes(1, byteFoto);
			ps.setString(2, nick);
			ps.executeUpdate();
			ps.close();
	}
	
/*********************************************************************************************************************/
/********************************************************************************************************************/
	
}
